# 有5个具有5种不同颜色的房间；每个房间里分别住着一个不同国籍的人；每个人都在喝一种特定品牌的饮料；抽一特定品牌的香烟；养一特定的宠物；没有任意的两个人在抽相同品牌的烟、或喝相同品牌饮料、或养相同的宠物。
# 同时又知：
# 4.绿房子紧挨着白房子，在白房子的左边；

# 2.瑞典人养狗；
# 9.挪威人住在第一个房子里（最左边）；1
# 1.英国人住在红房子里；
# 4.挪威人和住蓝房子的人相邻；1

# 8.住中间房子的人喝牛奶；
# 3.丹麦人喝茶；
# 5.绿房子主人喝咖啡；


# 6.抽PALL MALL牌香烟的人养鸟；
# 7.黄房子里的人抽DUNHILL牌的烟；
# 2.抽BLUEMASTER牌香烟的人喝啤酒；1
# 3.德国人抽PRINCE牌香烟；1
# 0.抽BLENDS香烟的人和养猫的人相邻；1
# 1.养马的人和抽DUNHILL牌香烟的人相邻；1
# 5.抽BLENDS牌香烟的人和喝矿泉水的人相邻。
# 问：谁在养鱼？

import logging as log

log.basicConfig(level=log.DEBUG)
log.debug("this is a demo massage")


data_table = [
    ["r", "g", "b", "w", "y"],  # 房子颜色
    ["英", "瑞", "挪", "丹", "德"],  # 国籍
    ["茶", "咖", "奶", "酒", "水"],  # 饮料
    ["pall", "dunh", "blen", "blue", "prin"],  # 香烟
    ["狗", "鸟", "猫", "马", "鱼"],  # 宠物 固定
]

dimension_length = len(data_table) - 1  # 最后一排固定
level_length = len(data_table[0])

total = 0


def dimension_cut_2(dimension):
    if dimension == 0:  # 房子约束
        # 绿房子紧挨着白房子，在白房子的左边；
        if data_table[0][0] == "w":
            return False

        for i in range(level_length):
            if data_table[0][i] == "g":
                green_index = i
            if data_table[0][i] == "w":
                white_index = i
        # 绿房子在白房子左边
        if green_index - white_index != -1:
            return False

    if dimension == 1:  # 国籍约束
        # 挪威人住在第一个房子里
        if data_table[1][0] != "挪":
            return False

        # 1.英国人住在红房子里；
        for i in range(level_length):
            if data_table[0][i] == "r":
                red_index = i
            if data_table[1][i] == "英":
                british_index = i
            if data_table[0][i] == "b":
                b_index = i
            if data_table[1][i] == "挪":
                norway_index = i

        if british_index != red_index:
            return False

        # 瑞典人养狗
        if data_table[1][0] != "瑞":
            return False

        # 4.挪威人和住蓝房子的人相邻；1
        if abs(b_index - norway_index) != 1:
            return False

    if dimension == 2:  # 饮料后
        # 中间喝牛奶
        if data_table[2][2] != "奶":
            return False

        for i in range(level_length):
            if data_table[1][i] == "丹":
                denmark_index = i

            if data_table[0][i] == "g":
                green_index = i

        # 3.丹麦人喝茶；
        if data_table[2][denmark_index] != "茶":
            return False
        # 5.绿房子主人喝咖啡；
        if data_table[2][green_index] != "咖":
            return False

    if dimension == 3:  # 最后确认
        for i in range(level_length):
            if data_table[1][i] == "英":
                british_index = i
            if data_table[1][i] == "丹":
                denmark_index = i
            if data_table[1][i] == "德":
                germany_index = i
            if data_table[1][i] == "挪":
                norway_index = i

            if data_table[0][i] == "g":
                green_index = i
            if data_table[0][i] == "y":
                yellow_index = i
            if data_table[0][i] == "b":
                b_index = i

            if data_table[2][i] == "酒":
                beer_index = i
            if data_table[2][i] == "水":
                water_index = i

            if data_table[3][i] == "blen":
                blen_index = i
            if data_table[3][i] == "dunh":
                dunh_index = i

        # 1.英国人住在红房子里；
        if data_table[0][british_index] != "r":
            return False

        # 3.丹麦人喝茶；
        if data_table[2][denmark_index] != "茶":
            return False

        # 5.绿房子主人喝咖啡；
        if data_table[2][green_index] != "咖":
            return False

        # 7.黄房子里的人抽DUNHILL牌的烟；
        if data_table[0][dunh_index] != "y":
            return False

        # 2.抽BLUEMASTER牌香烟的人喝啤酒；1
        if data_table[3][beer_index] != "blue":
            return False
        # 3.德国人抽PRINCE牌香烟；1
        if data_table[3][germany_index] != "prin":
            return False

        # 0.抽BLENDS香烟的人和养猫的人相邻；1
        if abs(blen_index - 2) != 1:
            return False

        # 4.挪威人和住蓝房子的人相邻；1
        if abs(b_index - norway_index) != 1:
            return False
        # 1.养马的人和抽DUNHILL牌香烟的人相邻；1
        if abs(dunh_index - 3) != 1:
            return False

        # 5.抽BLENDS牌香烟的人和喝矿泉水的人相邻。
        if abs(blen_index - water_index) != 1:
            return False

    print(data_table[1][4], data_table)

    return True


def all_arrange(
    dimension,
    level,
):
    global data_table, dimension_length, level_length, total

    if dimension >= dimension_length:
        # all dimension arranged

        return

    if level >= level_length:
        # level arranged
        # change dimension

        # 剪枝
        # 层次剪枝
        if dimension_cut_2(dimension):  # 通过,下一层
            all_arrange(dimension + 1, 0)

        return

    for i in range(level, level_length):

        data_table[dimension][level], data_table[dimension][i] = (
            data_table[dimension][i],
            data_table[dimension][level],
        )

        # next level
        all_arrange(dimension, level + 1)

        data_table[dimension][level], data_table[dimension][i] = (
            data_table[dimension][i],
            data_table[dimension][level],
        )


if __name__ == "__main__":
    all_arrange(0, 0)
